//
//  ReadMe.swift
//  Weibo27
//
//  Created by apple on 16/4/16.
//  Copyright © 2016年 itcast. All rights reserved.
//

import Foundation

/*
第三天上午内容回顾
1.只读属性
2.使用git 管理代码(团队开发)
3.SSH公钥 远程服务器添加公钥 
4.OSChina 创建一个项目
5.git clone
6.项目加忽略文件 必须先把他提交到服务器
7.创建新浪微博工程
8.提交我们项目
9.项目相关配置
10.分析产品需求 创建相关文件夹(MVC)
11.CZMainVc
12.自定义tabBar (重写父类init:frame 必须实现initCoder)添加一个撰写按钮
13.更改自定义的tabBar 子控件布局
14.使用Swift代理 需要继承基协议 (声明的代理不能弱引用)
15.@objc 给我们创建 button 点击事件私有化



第四天内容
1. 我们自己开发的APP 如何实现第三方登陆(新浪微博为例子) (SDK的方式 - 需要在真机完成操作)
    01 -  开发阶段 未上线
    - www.open.weibo.com
    - 如果有账号直接登陆 如果没有 注册账号
    - 在新浪微博平台注册一个应用 (app标识)
    - 新浪微博会给我返回来 AppKey (应用唯一标识) AppSecret 秘钥  token 或者uid 使用
    - 我们的App中 我们需要在我们项目中 注册 需要AppKey 告知新浪微博 

    02 - 用户使用阶段 上线
    - 当用户点击使用我们app的时候 自己到 登陆界面
    - 用户考虑到个人信息安全问题 不信任我们的app 那么采用第三方登陆
    - 在我们app中跳转到用户手机安装的新浪微博客户端 
        如果用户没有登陆 先登陆 在授权
        如果已经登陆了 直接授权
    - 授权成功后跳回我们开发的app 
        - 新浪微博在我们跳到我们app后 会给我们一些关于用户的个人数据(openid, 昵称,性别)
        - 我们开发者得到用户的新浪微博返回来的数据 发送请求
        - app 分两种注册方法  
            - 01 直接在我们app注册 输入手机号 和密码(给服务器的交互登陆的接口)
            - 02 通过第三方登陆注册 通过openid 和昵称 和性别和其他新浪微博给我们的个人信息数据注册  (给服务器的交互登陆的另一个注册的接口)
        - 当我们注册成功后 服务器会给我们返回来一个 token 或者userid
        - 用户拿到token 或者userid 就可以请求数据了 也就可以进入我们的app了 然后就可以请求我们的各种接口数据(例如 首页列表 或者个人信息数据接口)

2. 采用新浪微博提供的url 完成授权
    01 -  开发阶段 未上线
        - www.open.weibo.com
        - 如果有账号直接登陆 如果没有 注册账号
        - 在新浪微博平台注册一个应用 (app标识)
        - 需要们设置回调页 (我们程序员完成的)
        - 需要添加测试账号 便于我们开发者开发
        - 新浪微博会给我们返回的参数
            01 AppKey  应用唯一标识
            02 AppSecret  他是我们需要请求到accessToken 使用的参数数据
            03 回调页  我们通过回调页中的url 的到 我们的code(授权码)
            
        - 通过code (授权码和 AppSecret 和其他新浪微博指定的参数) 我们就能拿到accesstokon
        - accesstokon(访问令牌) 通过他就可以请求新浪微博的数据啦


第五天 

一,第四天内容回顾
    1.回顾了OC单例
    2.学习了Swift的单例 三种写法
    3.OC类使用Swift的类 Swift中调用OC的类
    4.通过AFN 在OCZ中和Swift中封装网络请求工具类(单例)
    5.Pod移除
    6.OAuth 授权 
        - SDK
        - webView授权
    7. 已经得到了code (授权码)

二,第五天目标
1.目标
    1.通过我们得到的code 获取access_token
    2.通过access_token 获取 用户信息数据(昵称和头像)
    3.对用户信息的数据进行本地保存
    4.做欢迎页
    5.App根据用户是否登录做app 根视图切换
        - 业务需求
        - 当我们第一次登陆 OAuth 登陆 -> 确认授权 -> 拿到code - accessToken - 用户数据 - 保存用户数据
        - 当我登陆成功以后 需要把根视图切换成我们的欢迎界面
                - 解决方案 需要我们OAuth 界面通知 appdelegate  切换根视图 (通过通知)



    6.获取我们首页的微博数据

    
a.小结回顾
    - 获取accessToken
    - 通过accessToken 获取用户信息
    - 保存用户数据(不用用户每次都登陆,直接可以使用我们的app)
        - 通过归档保存数据 
        - 使用单例管理

2.如果判断我们的access_token 是否存在
    例子:  当前时间 2016-01-01     我们的token过期时间 2015-12-31  2016-01-02
    - 如果时间过期了  access_token 不存在
    - 如果我们的时间没有过期 直接从本地数据得到 access_token
3.如果判断我们是否登录
    - 如果我的access_token == nil 没有登录
    - 如果我的access_token != nil 已经登录

4. 业务需求 
    - 如果我们用户没有登录 --- 根视图 ---  MainVc
    - 如果我们用户已经登录 ---- 根视图 --- WelcomeVc





第六天 首页cell布局
    - 上午总结
    1. 原创微博
    2. 底部(转发 评论 赞)
    3. 转发微博
        - 是否有转发微博   (需要注意吧约束写在掉)
                - 有   toolbar 的top == 转发微博的底部
                - 无   toolbar 的top == 原创微博的底部


    - 底部tool 显示 转发 评论 赞 的业务逻辑
        - 如果我们的 count <= 0  直接显示  转发 评论 赞 文字 
            -例如 count == 0  显示 转发 评论 赞
        - 如果我们的 count > 0 && count < 10000  直接显示 count
            -例如 count == 888  显示 888
        - 如果我们的 count >= 10000  显示 1万 2万
            -例如 count 10000  显示 1 万   20000  2万
            -例如 count 12000  显示 1.2万


第七天 来源 下拉刷新 时间格式化

    -第六天内容回顾
        - 主要点: 主要分析我们是否有转发微博 -- 转发微博字段 (里面参数和原创微博的参数相同 而且需要我们自己字典转模型)
        - 原创微博  无配图
                  有配图 (注意我们原创微博的bottom的约束 ---> 先卸载在约束 --> 约束对应的对象在发生改变)
        - 底部toolbar (转发 评论 赞的业务逻辑处理)
        -  转发微博 无配图
                  有配图 (注意我们转发微博的bottom的约束 ---> 先卸载在约束 --> 约束对应的对象在发生改变)
        -  tableView的预估行高 (越接近我们cell 的实际高度越高)

    -今日计划
        - 转发评论赞逻辑处理
        - 来源字符串处理
        - 微博首页网络请求优化
        - 上拉加载更多
                - 需要的控件 UIActivityIndicatorView 
                - 设置为tableView的footView
                - 通过判断监听显示最后一个cell 然后执行UIActivityIndicatorView 动画 在进行网络请求
                - sinceid (做下拉刷新使用)和 maxid (上拉加载更多)
                        - maxid  我们需要自己处理 需要 maxid =  maxid - 1 防止数据重复
                        - 如果是下拉刷新  maxid ==  0 (为了什么: 为了告知服务器我们是上啦还是下拉)
                        - 如果是上拉加载更过 sinceid ==  0 (为了什么: 为了告知服务器我们是上啦还是下拉)
                - 当我们上啦记载更多数据请求成功以后 我们要停止UIActivityIndicatorView 动画
                - 我们通过UIActivityIndicatorView 属否动画 给我们loadData 传入参数 来供我们判断是否是 上拉加载更多
        - 系统下拉刷新(UIRefreshControl)
                - addTarget valuechange  指定我们的loaddata 方法请求数据
                - 当我们请求成功以后 我们需要 UIRefreshControl 停止动画
        - 自定义下拉刷新
            - 分析
                    - 继承与谁 ->UIControl
                    - 添加到谁的身上 -> tableView身上 willMoveToSuperview
                    - 控件Y坐标 -> -控件高度
                    - 通过监听tableView的contentOffset.y 变化来判断我们的文字改变(通过KVO)
                            - 注意移除(使用KVO) 
                            - 通过observeValueForKeyPath 监听我们监听的对象的属性的改变
                    - 正常状态 (没有松手)  contentOffset.y > -114 && 当前状态为pulling
                    - 松手刷新 (没有松手)  contentOffset.y <= -114 && 当前状态为normal
                    - 刷新中(已经松手)
                            - 上一个状态 松手刷新
                            - 必须还松手
        - 下拉刷新数据条数提示
        - 微博时间字符串处理
                - 业务需求逻辑
                        - 如果是今年
                                -如果是今天    
                                        - 如果 < 60 s  显示格式: 刚刚
                                        - 如果 >=60 && < 60 * 60  显示格式: xx分钟前
                                        - 其他 显示格式: xx小时前
                                -如果是昨天
                                        -例如 2016-04-22 19:19:19  显示格式: 昨天 19:19
                                -其他
                                        -例如 2016-04-04 20:20:20  显示格式: 04月04日 20:20
                        - 如果不是今年
                                -例如: 2015-01-01 18:18:18 显示格式: 2015年01月01日 18:18
                        
第八天 时间处理 发布微博
    -今日计划
        - 时间字符串处理
        - 发布微博界面搭建
        - 导航按钮
        - 导航的titleView
        - 自定义TextView
        - 判断右侧按钮是否可以点击
        - 自定义底部toolbar
        - 配图视图选择照片
        - 自定义表情键盘
        - 通过inputView 切换键盘


第九天 表情键盘
    - 今日计划
        - 自定义表情键盘底部toolbar
        - 显示表情键盘
        - 读取Bundle文件的数据

        /*
        - 默认表情  108 (6页)
            - 20
            - 20
            - 20
            - 20
            - 20
            - 8
            - Emoji表情 80(4页)
            - 20
            - 20
            - 20
            - 20
            - 浪小花 40 (2页)
            - 20
            - 20

*/
        - 使用UIPageControl
        - 十六进制字符串转Emoji表情 (NSStringEmoji 第三方库)


第十天 发布微博
        -今日计划
            - 表情键盘删除按钮事件
            - Emoji表情上屏
            - 学习NSTextAttachment(文本附件)
            - 图片表情上屏
            - 发送文字微博
            - 发送文字+图片微博
            - 发送图片表情文字微博
            - 使用正则匹配图片表情(RegexKitLite)
            -RegexKitLite
            -MRC
            -添加libicucore
            -匹配中文 \\u4e00-\\u9fa5




第十一天 微博缓存
        - 今日计划
            - FMDB回顾
            - 创建数据库
            - 建表
            - 三种插入数据方式
            - 查询数据
            - 微博首页数据缓存
            - 保存网络请求到的微博数据
            - 查询本地是否有缓存数据
            - 如果有 直接从本地读取
            - 如果无 再从网络获取
            - 然后再保存网络请求到的微博数据
            - 发布微博界面界面优化
            - 发送按钮状态改变问题
            - 是否显示占位文字问题
            - pageControl 用户交互问题
            - 首页 转发 评论 赞 （扩展）
            - 使用第三方框架 SDPhotoBrowser 做图片预览




















*/